package admin

import (
	"geekai/api/dto/request"
	"geekai/api/dto/response"
	"geekai/api/handler"
	"geekai/core"
	"geekai/core/types"
	"geekai/model"
	"geekai/utils"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// ChatAppTypeHandler 应用分类
type ChatAppTypeHandler struct {
	handler.BaseHandler
}

func NewChatAppTypeHandler(app *core.AppServer, db *gorm.DB) *ChatAppTypeHandler {
	return &ChatAppTypeHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}

// SaveOrUpdate godoc
// @Summary      添加或者修改应用分类
// @Description  添加或者修改应用分类
// @Tags         后台管理-应用分类
// @Accept       json
// @Produce      json
// @Param        req   body     request.AppTypeSaveOrUpdateReq  true  "应用分类"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/app/type/saveOrUpdate [post]
// @Security AdminApiKeyAuth
func (h *ChatAppTypeHandler) SaveOrUpdate(c *gin.Context) {
	var data request.AppTypeSaveOrUpdateReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}

	// 新增
	if data.Id == 0 {
		err := h.DB.Where("name", data.Name).First(&model.AppType{}).Error
		if err == nil {
			utils.ERROR(c, "当前应用分类已经存在")
			return
		}
		err = h.DB.Create(&model.AppType{
			Name:    data.Name,
			Icon:    data.Icon,
			Enabled: data.Enabled,
			SortNum: data.SortNum,
		}).Error
		if err != nil {
			utils.ERROR(c, "添加应用分类失败："+err.Error())
			return
		}
	} else { // 修改应用分类
		err := h.DB.Model(&model.AppType{}).Where("id", data.Id).Updates(map[string]interface{}{
			"name":    data.Name,
			"icon":    data.Icon,
			"enabled": data.Enabled,
		}).Error
		if err != nil {
			utils.ERROR(c, "修改应用分类出错："+err.Error())
			return
		}
	}
	utils.SUCCESS(c)
}

// List godoc
// @Summary      获取应用分类列表
// @Description  获取应用分类列表
// @Tags         后台管理-应用分类
// @Accept       json
// @Produce      json
// @Success      200  {object}  types.BizVo{data=[]response.AppTypeListResp}
// @Router       /api/admin/app/type/list [get]
// @Security AdminApiKeyAuth
func (h *ChatAppTypeHandler) List(c *gin.Context) {
	var items []model.AppType
	var appTypes = make([]response.AppTypeListResp, 0)
	err := h.DB.Order("sort_num ASC").Find(&items).Error
	if err != nil {
		utils.ERROR(c, "查询应用分类列表出错："+err.Error())
		return
	}
	for _, item := range items {
		var appType response.AppTypeListResp
		err = utils.CopyObject(item, &appType)
		if err != nil {
			continue
		}
		appType.Id = item.Id
		appType.CreatedAt = item.CreatedAt.Unix()
		appTypes = append(appTypes, appType)
	}
	utils.SUCCESS(c, appTypes)
}

// Remove godoc
// @Summary      删除应用类型
// @Description  删除应用类型
// @Tags         后台管理-应用分类
// @Accept       json
// @Produce      json
// @Param        id   query     int  true  "应用分类Id"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/app/type/remove [get]
// @Security AdminApiKeyAuth
func (h *ChatAppTypeHandler) Remove(c *gin.Context) {
	id := h.GetInt(c, "id", 0)
	if id <= 0 {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	err := h.DB.Where("id", id).Delete(&model.AppType{}).Error
	if err != nil {
		utils.ERROR(c, "删除应用分类出错："+err.Error())
		return
	}
	utils.SUCCESS(c)
}

// Enable godoc
// @Summary      启用|禁用
// @Description  启用|禁用
// @Tags         后台管理-应用分类
// @Accept       json
// @Produce      json
// @Param        req   body     request.AppTypeEnableReq  true  "启用|禁用"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/app/type/enable [post]
// @Security AdminApiKeyAuth
func (h *ChatAppTypeHandler) Enable(c *gin.Context) {
	var data request.AppTypeEnableReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	err := h.DB.Model(&model.AppType{}).Where("id", data.Id).UpdateColumn("enabled", data.Enabled).Error
	if err != nil {
		utils.ERROR(c, "切换启用状态失败："+err.Error())
		return
	}
	utils.SUCCESS(c)
}

// Sort godoc
// @Summary      更新排序
// @Description  更新排序
// @Tags         后台管理-应用分类
// @Accept       json
// @Produce      json
// @Param        req   body     request.AppTypeSortReq  true  "应用分类排序"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/app/type/sort [post]
// @Security AdminApiKeyAuth
func (h *ChatAppTypeHandler) Sort(c *gin.Context) {
	var data request.AppTypeSortReq

	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	for index, id := range data.Ids {
		err := h.DB.Model(&model.AppType{}).Where("id", id).Update("sort_num", data.Sorts[index]).Error
		if err != nil {
			utils.ERROR(c, "更新排序失败："+err.Error())
			return
		}
	}
	utils.SUCCESS(c)
}
